package cn.mw.cmdb.config;

import cn.mw.cmdb.config.MQTT.MessageArrivedHandle;
import cn.mw.cmdb.config.MQTT.VersionTypeEnum;
import cn.mw.cmdb.config.MQTT.VersionTypeFactory;
import cn.mw.microMonitorCommon.util.SpringUtils;
import com.google.common.base.Strings;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;

/**
 * 发布消息的回调类
 * <p>
 * 必须实现MqttCallback的接口并实现对应的相关接口方法CallBack 类将实现 MqttCallBack。
 * 每个客户机标识都需要一个回调实例。在此示例中，构造函数传递客户机标识以另存为实例数据。
 * 在回调中，将它用来标识已经启动了该回调的哪个实例。
 * 必须在回调类中实现三个方法：
 * <p>
 * public void messageArrived(MqttTopic topic, MqttMessage message)接收已经预订的发布。
 * <p>
 * public void connectionLost(Throwable cause)在断开连接时调用。
 * <p>
 * public void deliveryComplete(MqttDeliveryToken token))
 * 接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。
 * 由 MqttClient.connect 激活此回调。
 */
@Slf4j
public class MQTTPushCallback implements MqttCallback {
    public void connectionLost(Throwable cause) {
        MQTTProviderConfig bean = SpringUtils.getBean(MQTTProviderConfig.class);
        bean.connect();
        // 连接丢失后，一般在这里面进行重连
        log.info("连接断开，可以做重连");
    }

    public void deliveryComplete(IMqttDeliveryToken token) {
        log.info("deliveryComplete---------" + token.isComplete());
    }

    public void messageArrived(String topic, MqttMessage message) throws Exception {
        log.info("接收消息主题 : " + topic);
        log.info("接收消息Qos : " + message.getQos());
//        接收消息主题 : V5008Upload/3394772088/LabelState  接收消息内容 : BB 05 715151 9E 00 2A 06 0C 00 21 BA DF 11 0F 00 21 B7 92 11 14 00 21 AD 96 D1 15 00 21 B1 F8 11 1C 00 21 AE 86 A1 24 00 21 B5 F7 11
//        接收消息主题 : V5008Upload/3394772088/OpeAck    接收消息内容 : CC 01 00 00 00 00 00 02 00 00 00 00 00 03 00 00 00 00 00 04 00 00 00 00 00 05 71 51 51 9E 2A 06 00 00 00 00 00 07 00 00 00 00 00 08 00 00 00 00 00 09 00 00 00 00 00 0A 00 00 00 00 00
        try {
            byte[] payload = message.getPayload();
            String type = "";
            if (topic.contains(VersionTypeEnum.V5008.name())) {
                type = VersionTypeEnum.V5008.name();
            }
            if (topic.contains(VersionTypeEnum.V6800.name())) {
                type = VersionTypeEnum.V6800.name();
            }
            if (!Strings.isNullOrEmpty(type)) {
                MessageArrivedHandle build = VersionTypeFactory.build(type);
                build.messageManage(topic, payload);
            }
        } catch (Exception e) {
            log.info("接收消息失败::" + e);
        }
    }
}
